home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Fritz: All Fritz
/
All Fritz.zip
/
All Fritz
/
FILES
/
DEMO_VGA
/
DEMOCGA.LZH
/
MAZE.BAS
< prev
next >
Wrap
BASIC Source File
|
1985-12-24
|
7KB
|
231 lines
10 REM This program will generate a maze on the screen of an IBM
20 REM compatible PC. A different random number seed will produce a
30 REM different maze.
40 REM
50 REM Written by James L. Dean
60 REM 406 40th Street
70 REM New Orleans, LA 70124
80 REM December 22, 1985
90 REM
100 KEY OFF
110 CLS
120 RANDOMIZE TIMER
130 NUM.COLUMNS%=79
140 NUM.ROWS%=49
150 REM DIM PATH%(NUM.COLUMNS%,NUM.ROWS%)
160 DIM PATH%(79,49)
170 DIM DELTA%(21,2)
180 DIM MAGNITUDE%(2)
190 MAGNITUDE%(1)=(319\NUM.COLUMNS%)\2
200 MAGNITUDE%(2)=(199\NUM.ROWS%)\2
210 X.MAX%=2*MAGNITUDE%(1)*NUM.COLUMNS%
220 Y.MAX%=2*MAGNITUDE%(2)*NUM.ROWS%
230 FOR DELTA.INDEX.1%=1 TO 10
240 DELTA%(DELTA.INDEX.1%,1)=1
250 DELTA%(DELTA.INDEX.1%,2)=0
260 NEXT DELTA.INDEX.1%
270 FOR DELTA.INDEX.1%=11 TO 17
280 DELTA%(DELTA.INDEX.1%,1)=0
290 DELTA%(DELTA.INDEX.1%,2)=1
300 NEXT DELTA.INDEX.1%
310 FOR DELTA.INDEX.1%=18 TO 19
320 DELTA%(DELTA.INDEX.1%,1)=-1
330 DELTA%(DELTA.INDEX.1%,2)=0
340 NEXT DELTA.INDEX.1%
350 FOR DELTA.INDEX.1%=20 TO 21
360 DELTA%(DELTA.INDEX.1%,1)=0
370 DELTA%(DELTA.INDEX.1%,2)=-1
380 NEXT DELTA.INDEX.1%
390 DIM COORD%(2),NEW.COORD%(2)
400 SCREEN 1
405 COLOR 0,4
410 CLS
420 X%=0
430 WHILE (X% <= X.MAX%)
440 LINE (X%,0)-(X%,Y.MAX%),3
450 X%=X%+2*MAGNITUDE%(1)
460 WEND
470 Y%=0
480 WHILE (Y% <= Y.MAX%)
490 LINE (0,Y%)-(X.MAX%,Y%),3
500 Y%=Y%+2*MAGNITUDE%(2)
510 WEND
520 FOR COLUMN%=1 TO NUM.COLUMNS%
530 FOR ROW%=1 TO NUM.ROWS%
540 PATH%(COLUMN%,ROW%)=0
550 NEXT ROW%
560 NEXT COLUMN%
570 COORD%(1)=1
580 COORD%(2)=1
590 NUM.PATHS%=1
600 PATH%(1,1)=NUM.PATHS%
610 GOTO 830
620 DEAD.END%=0
630 FOR DELTA.INDEX.1%=1 TO 21
640 DELTA.INDEX.2%=1+INT(21!*RND)
650 FOR DIM.NUM%=1 TO 2
660 TEM.INT%=DELTA%(DELTA.INDEX.1%,DIM.NUM%)
670 DELTA%(DELTA.INDEX.1%,DIM.NUM%)=DELTA%(DELTA.INDEX.2%,DIM.NUM%)
680 DELTA%(DELTA.INDEX.2%,DIM.NUM%)=TEM.INT%
690 NEXT DIM.NUM%
700 NEXT DELTA.INDEX.1%
710 FOR DELTA.INDEX.1%=1 TO 21
720 FOR DIM.NUM%=1 TO 2
730 NEW.COORD%(DIM.NUM%)=COORD%(DIM.NUM%)+DELTA%(DELTA.INDEX.1%,DIM.NUM%)
740 NEXT DIM.NUM%
750 IF NEW.COORD%(1) < 1 THEN 800
760 IF NEW.COORD%(1) > NUM.COLUMNS% THEN 800
770 IF NEW.COORD%(2) < 1 THEN 800
780 IF NEW.COORD%(2) > NUM.ROWS% THEN 800
790 IF PATH%(NEW.COORD%(1),NEW.COORD%(2)) = 0 THEN 820
800 NEXT DELTA.INDEX.1%
810 DEAD.END%=1
820 RETURN
830 GOSUB 620
840 IF DEAD.END% <> 0 THEN 410
850 GOSUB 1770
860 PATH%(COORD%(1),COORD%(2))=NUM.PATHS%
870 IF COORD%(1) <> NUM.COLUMNS% THEN 830
880 IF COORD%(2) <> NUM.ROWS% THEN 830
890 FOR DELTA.INDEX.1%=1 TO 10
900 DELTA%(DELTA.INDEX.1%,1)=-1
910 DELTA%(DELTA.INDEX.1%,2)=0
920 NEXT DELTA.INDEX.1%
930 FOR DELTA.INDEX.1%=11 TO 17
940 DELTA%(DELTA.INDEX.1%,1)=0
950 DELTA%(DELTA.INDEX.1%,2)=-1
960 NEXT DELTA.INDEX.1%
970 FOR DELTA.INDEX.1%=18 TO 19
980 DELTA%(DELTA.INDEX.1%,1)=1
990 DELTA%(DELTA.INDEX.1%,2)=0
1000 NEXT DELTA.INDEX.1%
1010 FOR DELTA.INDEX.1%=20 TO 21
1020 DELTA%(DELTA.INDEX.1%,1)=0
1030 DELTA%(DELTA.INDEX.1%,2)=1
1040 NEXT DELTA.INDEX.1%
1050 FOR COLUMN%=NUM.COLUMNS% TO 1 STEP -1
1060 STARTING.ROW%=1
1070 WHILE (STARTING.ROW% <= NUM.ROWS%)
1080 IF PATH%(COLUMN%,STARTING.ROW%) = 1 THEN 1110
1090 STARTING.ROW%=STARTING.ROW%+1
1100 WEND
1110 ROW%=STARTING.ROW%
1120 WHILE (ROW% < NUM.ROWS%)
1130 ROW%=ROW%+1
1140 IF PATH%(COLUMN%,ROW%) = 0 THEN GOSUB 1460
1150 WEND
1160 NEXT COLUMN%
1170 FOR DELTA.INDEX.1%=1 TO 10
1180 DELTA%(DELTA.INDEX.1%,1)=1
1190 DELTA%(DELTA.INDEX.1%,2)=0
1200 NEXT DELTA.INDEX.1%
1210 FOR DELTA.INDEX.1%=11 TO 17
1220 DELTA%(DELTA.INDEX.1%,1)=0
1230 DELTA%(DELTA.INDEX.1%,2)=1
1240 NEXT DELTA.INDEX.1%
1250 FOR DELTA.INDEX.1%=18 TO 19
1260 DELTA%(DELTA.INDEX.1%,1)=-1
1270 DELTA%(DELTA.INDEX.1%,2)=0
1280 NEXT DELTA.INDEX.1%
1290 FOR DELTA.INDEX.1%=20 TO 21
1300 DELTA%(DELTA.INDEX.1%,1)=0
1310 DELTA%(DELTA.INDEX.1%,2)=-1
1320 NEXT DELTA.INDEX.1%
1330 FOR COLUMN%=1 TO NUM.COLUMNS%
1340 STARTING.ROW%=1
1350 WHILE (STARTING.ROW% <= NUM.ROWS%)
1360 IF PATH%(COLUMN%,STARTING.ROW%) = 1 THEN 1390
1370 STARTING.ROW%=STARTING.ROW%+1
1380 WEND
1390 ROW%=STARTING.ROW%
1400 WHILE (ROW% > 1)
1410 ROW%=ROW%-1
1420 IF PATH%(COLUMN%,ROW%) = 0 THEN GOSUB 1460
1430 WEND
1440 NEXT COLUMN%
1450 GOTO 1880
1460 COORD%(1)=COLUMN%
1470 COORD%(2)=ROW%
1480 NUM.PATHS%=NUM.PATHS%+1
1490 PATH%(COORD%(1),COORD%(2))=NUM.PATHS%
1500 GOSUB 620
1510 IF DEAD.END% <> 0 THEN 1540
1520 GOSUB 1770
1530 GOTO 1490
1540 FOR DELTA.INDEX.1%=1 TO 21
1550 FOR DIM.NUM%=1 TO 2
1560 NEW.COORD%(DIM.NUM%)=COORD%(DIM.NUM%)+DELTA%(DELTA.INDEX.1%,DIM.NUM%)
1570 NEXT DIM.NUM%
1580 IF NEW.COORD%(1) < 1 THEN 1630
1590 IF NEW.COORD%(1) > NUM.COLUMNS% THEN 1630
1600 IF NEW.COORD%(2) < 1 THEN 1630
1610 IF NEW.COORD%(2) > NUM.ROWS% THEN 1630
1620 IF PATH%(NEW.COORD%(1),NEW.COORD%(2)) = 1 THEN 1750
1630 NEXT DELTA.INDEX.1%
1640 FOR DELTA.INDEX.1%=1 TO 21
1650 FOR DIM.NUM%=1 TO 2
1660 NEW.COORD%(DIM.NUM%)=COORD%(DIM.NUM%)+DELTA%(DELTA.INDEX.1%,DIM.NUM%)
1670 NEXT DIM.NUM%
1680 IF NEW.COORD%(1) < 1 THEN 1730
1690 IF NEW.COORD%(1) > NUM.COLUMNS% THEN 1730
1700 IF NEW.COORD%(2) < 1 THEN 1730
1710 IF NEW.COORD%(2) > NUM.ROWS% THEN 1730
1720 IF PATH%(NEW.COORD%(1),NEW.COORD%(2)) <> NUM.PATHS% THEN 1750
1730 NEXT DELTA.INDEX.1%
1740 GOTO 1760
1750 GOSUB 1770
1760 RETURN
1770 IF COORD%(1) = NEW.COORD%(1) THEN 1830
1780 X%=(COORD%(1)+NEW.COORD%(1)-1)*MAGNITUDE%(1)
1790 Y%=(2*COORD%(2)-1)*MAGNITUDE%(2)
1800 LINE (X%,Y%-MAGNITUDE%(2)+1)-(X%,Y%+MAGNITUDE%(2)-1),0
1810 COORD%(1)=NEW.COORD%(1)
1820 GOTO 1870
1830 X%=(2*COORD%(1)-1)*MAGNITUDE%(1)
1840 Y%=(COORD%(2)+NEW.COORD%(2)-1)*MAGNITUDE%(2)
1850 LINE (X%-MAGNITUDE%(1)+1,Y%)-(X%+MAGNITUDE%(1)-1,Y%),0
1860 COORD%(2)=NEW.COORD%(2)
1870 RETURN
1880 PAINT (MAGNITUDE%(1),MAGNITUDE%(2)),2,3
1890 X.LOW%=MAGNITUDE%(1)
1900 X.HIGH%=X.MAX%-X.LOW%
1910 X.STEP%=2*X.LOW%
1920 Y.LOW%=MAGNITUDE%(2)
1930 Y.HIGH%=Y.MAX%-Y.LOW%
1940 Y.STEP%=2*Y.LOW%
1950 FOR X%=X.LOW% TO X.HIGH% STEP X.STEP%
1960 Y%=Y.LOW%
1970 WHILE (POINT(X%,Y%) = 0)
1980 Y%=Y%+Y.STEP%
1990 WEND
2000 WHILE (Y% > Y.LOW%)
2010 Y%=Y%-Y.STEP%
2020 IF POINT(X%,Y%) <> 0 THEN 2060
2030 PAINT (X%,Y%),2,3
2040 Y.OUT%=Y%+MAGNITUDE%(2)
2050 LINE (X%-MAGNITUDE%(1)+1,Y.OUT%)-(X%+MAGNITUDE%(1)-1,Y.OUT%),2
2060 WEND
2070 NEXT X%
2080 FOR X%=X.HIGH% TO X.LOW% STEP -X.STEP%
2090 Y%=Y.LOW%
2100 WHILE (POINT(X%,Y%) = 0)
2110 Y%=Y%+Y.STEP%
2120 WEND
2130 WHILE (Y% < Y.HIGH%)
2140 Y%=Y%+Y.STEP%
2150 IF POINT(X%,Y%) <> 0 THEN 2190
2160 PAINT (X%,Y%),2,3
2170 Y.OUT%=Y%-MAGNITUDE%(2)
2180 LINE (X%-MAGNITUDE%(1)+1,Y.OUT%)-(X%+MAGNITUDE%(1)-1,Y.OUT%),2
2190 WEND
2200 NEXT X%
2210 PAINT (MAGNITUDE%(1),MAGNITUDE%(2)),0,3
2220 LINE (1,Y.MAX%)-(2*MAGNITUDE%(1)-1,Y.MAX%),0
2230 LINE (X.MAX%-2*MAGNITUDE%(1)+1,0)-(X.MAX%-1,0),0
2240 SOUND 400,18
2250 I$=INKEY$
2260 IF LEN(I$) = 0 THEN 2250
2270 SCREEN 0
2280 WIDTH 80
2290 END